package com.fd.spring.util;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 定义一个单例模式的工具类
 */
public class SpringUtil {
    //第一步 定义一个ApplicationContext对象 注意接口声明，子类声明
    // 如果在系统加载的时候就初始化ApplicationContext对象，那么这种模式叫做饿汉试单例模式
    private static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    //单例第二步，为了不让别人new当前对象，一般构造器要私有化
    private SpringUtil() {

    }

    //提供一个对外的static方法 用来访问当前类的applicationContext，当用户第一次访问的时候才创建对象，这种模式叫做懒汉式单例
    public static ApplicationContext getApplicationContext() {
        //通过同时又多个类线程镜像访问，有可能会创建多个对象，所以要用同步块
        synchronized (SpringUtil.class) {
            if (applicationContext == null) {
                applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            }
        }
        return applicationContext;
    }

    //自定义一个根据Bean的名称来得到Baen的方法
    public static Object getBaen(String beanName) {
        return applicationContext.getBean(beanName);
    }
}
